mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 17:14:41 +00:00
[INPORT] Add driver for bus mouse devices (#3173)
It adds basic input support for: - Standard Bus Mouse - Standard InPort Mouse - Logitech Bus Mouse - Microsoft Bus Mouse - Microsoft InPort Mouse - NEC PC-98 Bus Mouse Untested on PC/AT, but should work.
This commit is contained in:
parent
c464b02c90
commit
310a24da6e
11 changed files with 1563 additions and 0 deletions
|
@ -174,6 +174,7 @@ GenDisk = disk
|
|||
USB\Class_03 = hidusb
|
||||
GENERIC_HID_DEVICE = hidusb
|
||||
*PNP0303 = i8042prt,{4D36E96B-E325-11CE-BFC1-08002BE10318}
|
||||
*nEC1F00 = inport,{4D36E96F-E325-11CE-BFC1-08002BE10318}
|
||||
ROOT\SWENUM = swenum
|
||||
|
||||
[BootBusExtenders.Load]
|
||||
|
@ -203,6 +204,9 @@ buslogic = buslogic.sys
|
|||
storahci = storahci.sys
|
||||
disk = disk.sys
|
||||
|
||||
[MouseDrivers.Load]
|
||||
inport = inport.sys
|
||||
|
||||
[Cabinets]
|
||||
Cabinet=reactos.cab
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
add_subdirectory(i8042prt)
|
||||
add_subdirectory(inport)
|
||||
add_subdirectory(kbdclass)
|
||||
add_subdirectory(mouclass)
|
||||
add_subdirectory(sermouse)
|
||||
|
|
15
drivers/input/inport/CMakeLists.txt
Normal file
15
drivers/input/inport/CMakeLists.txt
Normal file
|
@ -0,0 +1,15 @@
|
|||
|
||||
list(APPEND SOURCE
|
||||
hardware.c
|
||||
inport.c
|
||||
inport.h
|
||||
ioctl.c
|
||||
pnp.c
|
||||
wmi.c)
|
||||
|
||||
add_library(inport MODULE ${SOURCE} inport.rc)
|
||||
|
||||
set_module_type(inport kernelmodedriver)
|
||||
add_pch(inport inport.h SOURCE)
|
||||
add_importlibs(inport ntoskrnl hal wmilib)
|
||||
add_cd_file(TARGET inport DESTINATION reactos/system32/drivers FOR all)
|
433
drivers/input/inport/hardware.c
Normal file
433
drivers/input/inport/hardware.c
Normal file
|
@ -0,0 +1,433 @@
|
|||
/*
|
||||
* PROJECT: ReactOS InPort (Bus) Mouse Driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Hardware support code
|
||||
* COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
|
||||
*/
|
||||
|
||||
/* Note: Some code was taken from Linux */
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "inport.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
|
||||
#ifdef ALLOC_PRAGMA
|
||||
#pragma alloc_text(PAGE, InPortInitializeMouse)
|
||||
#endif
|
||||
|
||||
#define READ_MOUSE(DeviceExtension, Port) \
|
||||
READ_PORT_UCHAR((DeviceExtension)->IoBase + (Port))
|
||||
|
||||
#define WRITE_MOUSE(DeviceExtension, Port, Data) \
|
||||
WRITE_PORT_UCHAR((DeviceExtension)->IoBase + (Port), (Data))
|
||||
|
||||
/*
|
||||
* NEC
|
||||
*/
|
||||
#define NEC_BM_DATA 0x00
|
||||
|
||||
#define NEC_BM_CONTROL 0x04
|
||||
#define NEC_INT_ENABLE 0x00
|
||||
#define NEC_INT_DISABLE 0x10
|
||||
|
||||
#define NEC_READ_X_LOW 0x00
|
||||
#define NEC_READ_X_HIGH 0x20
|
||||
#define NEC_READ_Y_LOW 0x40
|
||||
#define NEC_READ_Y_HIGH 0x60
|
||||
|
||||
#define NEC_INPUT_CAPTURE 0x00
|
||||
#define NEC_INPUT_HOLD 0x80
|
||||
|
||||
#define NEC_BM_CONFIG 0x06
|
||||
#define NEC_PPI_INT_ENABLE 0x08
|
||||
#define NEC_PPI_INT_DISABLE 0x09
|
||||
#define NEC_PPI_HC_NO_CLEAR 0x0E
|
||||
#define NEC_PPI_HC_CLEAR 0x0F
|
||||
#define NEC_PPI_DEFAULT_MODE 0x93
|
||||
|
||||
#define NEC_BM_INT_RATE 0x4002
|
||||
#define NEC_RATE_120_HZ 0x00
|
||||
#define NEC_RATE_60_HZ 0x01
|
||||
#define NEC_RATE_30_HZ 0x02
|
||||
#define NEC_RATE_15_HZ 0x03
|
||||
|
||||
#define NEC_BM_HIRESO_BASE (PUCHAR)0x61
|
||||
|
||||
#define NEC_BUTTON_RIGHT 0x20
|
||||
#define NEC_BUTTON_LEFT 0x80
|
||||
|
||||
/*
|
||||
* Microsoft InPort
|
||||
*/
|
||||
#define MS_INPORT_CONTROL 0x00
|
||||
#define INPORT_REG_BTNS 0x00
|
||||
#define INPORT_REG_X 0x01
|
||||
#define INPORT_REG_Y 0x02
|
||||
#define INPORT_REG_MODE 0x07
|
||||
#define INPORT_RESET 0x80
|
||||
|
||||
#define MS_INPORT_DATA 0x01
|
||||
#define INPORT_MODE_IRQ 0x01
|
||||
#define INPORT_MODE_BASE 0x10
|
||||
#define INPORT_MODE_HOLD 0x20
|
||||
|
||||
#define MS_INPORT_SIGNATURE 0x02
|
||||
|
||||
#define MS_BUTTON_MIDDLE 0x01
|
||||
#define MS_BUTTON_LEFT 0x02
|
||||
#define MS_BUTTON_RIGHT 0x04
|
||||
|
||||
/*
|
||||
* Logitech
|
||||
*/
|
||||
#define LOG_BM_DATA 0x00
|
||||
|
||||
#define LOG_BM_SIGNATURE 0x01
|
||||
#define LOG_SIGNATURE_BYTE 0xA5
|
||||
|
||||
#define LOG_BM_CONTROL 0x02
|
||||
#define LOG_ENABLE_IRQ 0x00
|
||||
#define LOG_DISABLE_IRQ 0x10
|
||||
|
||||
#define LOG_READ_X_LOW 0x80
|
||||
#define LOG_READ_X_HIGH 0xA0
|
||||
#define LOG_READ_Y_LOW 0xC0
|
||||
#define LOG_READ_Y_HIGH 0xE0
|
||||
|
||||
#define LOG_BM_CONFIG 0x03
|
||||
#define LOG_DEFAULT_MODE 0x90
|
||||
#define LOG_CONFIG_BYTE 0x91
|
||||
|
||||
#define LOG_BUTTON_RIGHT 0x20
|
||||
#define LOG_BUTTON_MIDDLE 0x40
|
||||
#define LOG_BUTTON_LEFT 0x80
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
InPortDpcForIsr(
|
||||
_In_ PKDPC Dpc,
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_opt_ PVOID Context)
|
||||
{
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
KIRQL OldIrql;
|
||||
ULONG DummyInputDataConsumed;
|
||||
INPORT_RAW_DATA RawData;
|
||||
|
||||
UNREFERENCED_PARAMETER(Dpc);
|
||||
UNREFERENCED_PARAMETER(Irp);
|
||||
UNREFERENCED_PARAMETER(Context);
|
||||
|
||||
/* Copy raw data */
|
||||
OldIrql = KeAcquireInterruptSpinLock(DeviceExtension->InterruptObject);
|
||||
RawData = DeviceExtension->RawData;
|
||||
KeReleaseInterruptSpinLock(DeviceExtension->InterruptObject, OldIrql);
|
||||
|
||||
/* Fill out fields */
|
||||
DeviceExtension->MouseInputData.LastX = RawData.DeltaX;
|
||||
DeviceExtension->MouseInputData.LastY = RawData.DeltaY;
|
||||
DeviceExtension->MouseInputData.ButtonFlags = 0;
|
||||
if (RawData.ButtonDiff != 0)
|
||||
{
|
||||
switch (DeviceExtension->MouseType)
|
||||
{
|
||||
case NecBusMouse:
|
||||
{
|
||||
if (RawData.ButtonDiff & NEC_BUTTON_LEFT)
|
||||
{
|
||||
if (RawData.Buttons & NEC_BUTTON_LEFT)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
|
||||
}
|
||||
if (RawData.ButtonDiff & NEC_BUTTON_RIGHT)
|
||||
{
|
||||
if (RawData.Buttons & NEC_BUTTON_RIGHT)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case MsInPortMouse:
|
||||
{
|
||||
/* Button flags have to be inverted */
|
||||
if (RawData.ButtonDiff & MS_BUTTON_LEFT)
|
||||
{
|
||||
if (RawData.Buttons & MS_BUTTON_LEFT)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
|
||||
}
|
||||
if (RawData.ButtonDiff & MS_BUTTON_RIGHT)
|
||||
{
|
||||
if (RawData.Buttons & MS_BUTTON_RIGHT)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
|
||||
}
|
||||
if (RawData.ButtonDiff & MS_BUTTON_MIDDLE)
|
||||
{
|
||||
if (RawData.Buttons & MS_BUTTON_MIDDLE)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case LogitechBusMouse:
|
||||
{
|
||||
if (RawData.ButtonDiff & LOG_BUTTON_LEFT)
|
||||
{
|
||||
if (RawData.Buttons & LOG_BUTTON_LEFT)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
|
||||
}
|
||||
if (RawData.ButtonDiff & LOG_BUTTON_RIGHT)
|
||||
{
|
||||
if (RawData.Buttons & LOG_BUTTON_RIGHT)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
|
||||
}
|
||||
if (RawData.ButtonDiff & LOG_BUTTON_MIDDLE)
|
||||
{
|
||||
if (RawData.Buttons & LOG_BUTTON_MIDDLE)
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;
|
||||
else
|
||||
DeviceExtension->MouseInputData.ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Send mouse packet */
|
||||
(*(PSERVICE_CALLBACK_ROUTINE)DeviceExtension->ClassService)(
|
||||
DeviceExtension->ClassDeviceObject,
|
||||
&DeviceExtension->MouseInputData,
|
||||
&DeviceExtension->MouseInputData + 1,
|
||||
&DummyInputDataConsumed);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
InPortIsr(
|
||||
_In_ PKINTERRUPT Interrupt,
|
||||
_In_ PVOID Context)
|
||||
{
|
||||
UCHAR Buttons;
|
||||
ULONG ButtonDiff;
|
||||
CHAR DeltaX, DeltaY;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = Context;
|
||||
|
||||
UNREFERENCED_PARAMETER(Interrupt);
|
||||
|
||||
switch (DeviceExtension->MouseType)
|
||||
{
|
||||
case NecBusMouse:
|
||||
{
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONTROL,
|
||||
NEC_INPUT_CAPTURE | NEC_INT_DISABLE);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONTROL,
|
||||
NEC_INPUT_HOLD | NEC_INT_DISABLE | NEC_READ_X_LOW);
|
||||
DeltaX = READ_MOUSE(DeviceExtension, NEC_BM_DATA) & 0x0F;
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONTROL,
|
||||
NEC_INPUT_HOLD | NEC_INT_DISABLE | NEC_READ_X_HIGH);
|
||||
DeltaX |= READ_MOUSE(DeviceExtension, NEC_BM_DATA) << 4;
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONTROL,
|
||||
NEC_INPUT_HOLD | NEC_INT_DISABLE | NEC_READ_Y_LOW);
|
||||
DeltaY = READ_MOUSE(DeviceExtension, NEC_BM_DATA) & 0x0F;
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONTROL,
|
||||
NEC_INPUT_HOLD | NEC_INT_DISABLE | NEC_READ_Y_HIGH);
|
||||
Buttons = READ_MOUSE(DeviceExtension, NEC_BM_DATA);
|
||||
DeltaY |= Buttons << 4;
|
||||
Buttons &= (NEC_BUTTON_LEFT | NEC_BUTTON_RIGHT);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONTROL,
|
||||
NEC_INPUT_HOLD | NEC_INT_ENABLE);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case MsInPortMouse:
|
||||
{
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_MODE);
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_DATA,
|
||||
INPORT_MODE_HOLD | INPORT_MODE_IRQ | INPORT_MODE_BASE);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_X);
|
||||
DeltaX = READ_MOUSE(DeviceExtension, MS_INPORT_DATA);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_Y);
|
||||
DeltaY = READ_MOUSE(DeviceExtension, MS_INPORT_DATA);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_BTNS);
|
||||
Buttons = READ_MOUSE(DeviceExtension, MS_INPORT_DATA);
|
||||
Buttons &= (MS_BUTTON_MIDDLE | MS_BUTTON_LEFT | MS_BUTTON_RIGHT);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_MODE);
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_DATA,
|
||||
INPORT_MODE_IRQ | INPORT_MODE_BASE);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case LogitechBusMouse:
|
||||
{
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_READ_X_LOW);
|
||||
DeltaX = READ_MOUSE(DeviceExtension, LOG_BM_DATA) & 0x0F;
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_READ_X_HIGH);
|
||||
DeltaX |= READ_MOUSE(DeviceExtension, LOG_BM_DATA) << 4;
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_READ_Y_LOW);
|
||||
DeltaY = READ_MOUSE(DeviceExtension, LOG_BM_DATA) & 0x0F;
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_READ_Y_HIGH);
|
||||
Buttons = READ_MOUSE(DeviceExtension, LOG_BM_DATA);
|
||||
DeltaY |= Buttons << 4;
|
||||
Buttons &= (LOG_BUTTON_RIGHT | LOG_BUTTON_MIDDLE | LOG_BUTTON_LEFT);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_ENABLE_IRQ);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ButtonDiff = DeviceExtension->MouseButtonState ^ Buttons;
|
||||
DeviceExtension->MouseButtonState = Buttons;
|
||||
|
||||
/*
|
||||
* Bus mouse devices don't have a status register to check
|
||||
* whether this interrupt is indeed for us.
|
||||
*/
|
||||
if ((DeltaX == 0) && (DeltaY == 0) && (ButtonDiff == 0))
|
||||
{
|
||||
/* We just pretend that the interrupt is not ours */
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DeviceExtension->RawData.DeltaX = DeltaX;
|
||||
DeviceExtension->RawData.DeltaY = DeltaY;
|
||||
DeviceExtension->RawData.Buttons = Buttons;
|
||||
DeviceExtension->RawData.ButtonDiff = ButtonDiff;
|
||||
|
||||
IoRequestDpc(DeviceExtension->Self, NULL, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
InPortInitializeMouse(
|
||||
_In_ PINPORT_DEVICE_EXTENSION DeviceExtension)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
/* Initialize mouse and disable interrupts */
|
||||
switch (DeviceExtension->MouseType)
|
||||
{
|
||||
case NecBusMouse:
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_DEFAULT_MODE);
|
||||
|
||||
/* Setup interrupt rate (unavailable on hireso machines) */
|
||||
if (DeviceExtension->IoBase != NEC_BM_HIRESO_BASE)
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_INT_RATE, NEC_RATE_60_HZ);
|
||||
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_INT_DISABLE);
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_HC_NO_CLEAR);
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_HC_CLEAR);
|
||||
break;
|
||||
|
||||
case MsInPortMouse:
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_RESET);
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_MODE);
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_DATA, INPORT_MODE_BASE);
|
||||
break;
|
||||
|
||||
case LogitechBusMouse:
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONFIG, LOG_DEFAULT_MODE);
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_DISABLE_IRQ);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
InPortStartMouse(
|
||||
_In_ PVOID SynchronizeContext)
|
||||
{
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = SynchronizeContext;
|
||||
|
||||
/* Enable interrupts */
|
||||
switch (DeviceExtension->MouseType)
|
||||
{
|
||||
case NecBusMouse:
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_INT_ENABLE);
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_HC_NO_CLEAR);
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_HC_CLEAR);
|
||||
break;
|
||||
|
||||
case MsInPortMouse:
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_MODE);
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_DATA,
|
||||
INPORT_MODE_IRQ | INPORT_MODE_BASE);
|
||||
break;
|
||||
|
||||
case LogitechBusMouse:
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_ENABLE_IRQ);
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
InPortStopMouse(
|
||||
_In_ PVOID SynchronizeContext)
|
||||
{
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = SynchronizeContext;
|
||||
|
||||
/* Disable interrupts */
|
||||
switch (DeviceExtension->MouseType)
|
||||
{
|
||||
case NecBusMouse:
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_INT_DISABLE);
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_HC_NO_CLEAR);
|
||||
WRITE_MOUSE(DeviceExtension, NEC_BM_CONFIG, NEC_PPI_HC_CLEAR);
|
||||
break;
|
||||
|
||||
case MsInPortMouse:
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_CONTROL, INPORT_REG_MODE);
|
||||
WRITE_MOUSE(DeviceExtension, MS_INPORT_DATA, INPORT_MODE_BASE);
|
||||
break;
|
||||
|
||||
case LogitechBusMouse:
|
||||
WRITE_MOUSE(DeviceExtension, LOG_BM_CONTROL, LOG_DISABLE_IRQ);
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
238
drivers/input/inport/inport.c
Normal file
238
drivers/input/inport/inport.c
Normal file
|
@ -0,0 +1,238 @@
|
|||
/*
|
||||
* PROJECT: ReactOS InPort (Bus) Mouse Driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Driver entrypoint
|
||||
* COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "inport.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
|
||||
#ifdef ALLOC_PRAGMA
|
||||
#pragma alloc_text(INIT, DriverEntry)
|
||||
#pragma alloc_text(PAGE, InPortCreateClose)
|
||||
#pragma alloc_text(PAGE, InPortAddDevice)
|
||||
#pragma alloc_text(PAGE, InPortUnload)
|
||||
#endif
|
||||
|
||||
UNICODE_STRING DriverRegistryPath;
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortCreateClose(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s(%p, %p) %X\n", __FUNCTION__, DeviceObject,
|
||||
Irp, IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
|
||||
|
||||
Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortAddDevice(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PDEVICE_OBJECT PhysicalDeviceObject)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PDEVICE_OBJECT Fdo;
|
||||
PINPORT_DEVICE_EXTENSION FdoExtension = NULL;
|
||||
WCHAR HardwareIdBuffer[32];
|
||||
UNICODE_STRING HardwareId;
|
||||
ULONG DummyResultLength;
|
||||
UNICODE_STRING HardwareId1 = RTL_CONSTANT_STRING(L"*nEC1F00");
|
||||
UNICODE_STRING HardwareId2 = RTL_CONSTANT_STRING(L"*PNP0F00");
|
||||
UNICODE_STRING HardwareId3 = RTL_CONSTANT_STRING(L"*PNP0F02");
|
||||
UNICODE_STRING HardwareId4 = RTL_CONSTANT_STRING(L"*PNP0F0D");
|
||||
UNICODE_STRING HardwareId5 = RTL_CONSTANT_STRING(L"*PNP0F11");
|
||||
UNICODE_STRING HardwareId6 = RTL_CONSTANT_STRING(L"*PNP0F15");
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s(%p, %p)\n", __FUNCTION__, DriverObject, PhysicalDeviceObject);
|
||||
|
||||
Status = IoCreateDevice(DriverObject,
|
||||
sizeof(INPORT_DEVICE_EXTENSION),
|
||||
NULL,
|
||||
FILE_DEVICE_INPORT_PORT,
|
||||
FILE_DEVICE_SECURE_OPEN,
|
||||
FALSE,
|
||||
&Fdo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to create FDO 0x%X\n", Status);
|
||||
goto Failure;
|
||||
}
|
||||
|
||||
FdoExtension = Fdo->DeviceExtension;
|
||||
|
||||
RtlZeroMemory(FdoExtension, sizeof(INPORT_DEVICE_EXTENSION));
|
||||
FdoExtension->State = dsStopped;
|
||||
FdoExtension->Self = Fdo;
|
||||
FdoExtension->Pdo = PhysicalDeviceObject;
|
||||
FdoExtension->Ldo = IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject);
|
||||
if (!FdoExtension->Ldo)
|
||||
{
|
||||
DPRINT1("Failed to attach FDO\n");
|
||||
Status = STATUS_NO_SUCH_DEVICE;
|
||||
goto Failure;
|
||||
}
|
||||
|
||||
IoInitializeRemoveLock(&FdoExtension->RemoveLock, INPORT_TAG, 0, 0);
|
||||
IoInitializeDpcRequest(Fdo, InPortDpcForIsr);
|
||||
|
||||
Status = IoGetDeviceProperty(PhysicalDeviceObject,
|
||||
DevicePropertyHardwareID,
|
||||
sizeof(HardwareIdBuffer),
|
||||
HardwareIdBuffer,
|
||||
&DummyResultLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to query the hardware ID string 0x%X\n", Status);
|
||||
goto Failure;
|
||||
}
|
||||
RtlInitUnicodeString(&HardwareId, HardwareIdBuffer);
|
||||
|
||||
if (RtlEqualUnicodeString(&HardwareId, &HardwareId1, FALSE))
|
||||
{
|
||||
FdoExtension->MouseType = NecBusMouse;
|
||||
FdoExtension->MouseAttributes.SampleRate = 60;
|
||||
FdoExtension->MouseAttributes.NumberOfButtons = 2;
|
||||
}
|
||||
else if (RtlEqualUnicodeString(&HardwareId, &HardwareId3, FALSE) ||
|
||||
RtlEqualUnicodeString(&HardwareId, &HardwareId4, FALSE))
|
||||
{
|
||||
FdoExtension->MouseType = MsInPortMouse;
|
||||
FdoExtension->MouseAttributes.SampleRate = 100;
|
||||
FdoExtension->MouseAttributes.NumberOfButtons = 3;
|
||||
}
|
||||
else if (RtlEqualUnicodeString(&HardwareId, &HardwareId2, FALSE) ||
|
||||
RtlEqualUnicodeString(&HardwareId, &HardwareId5, FALSE) ||
|
||||
RtlEqualUnicodeString(&HardwareId, &HardwareId6, FALSE))
|
||||
{
|
||||
FdoExtension->MouseType = LogitechBusMouse;
|
||||
FdoExtension->MouseAttributes.SampleRate = 100;
|
||||
FdoExtension->MouseAttributes.NumberOfButtons = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Unrecognized hardware '%wZ'\n", &HardwareId);
|
||||
Status = STATUS_DEVICE_REMOVED;
|
||||
goto Failure;
|
||||
}
|
||||
FdoExtension->MouseAttributes.MouseIdentifier = MOUSE_INPORT_HARDWARE;
|
||||
/* 1 packet */
|
||||
FdoExtension->MouseAttributes.InputDataQueueLength = sizeof(MOUSE_INPUT_DATA);
|
||||
|
||||
Fdo->Flags |= DO_BUFFERED_IO;
|
||||
if (FdoExtension->Ldo->Flags & DO_POWER_PAGABLE)
|
||||
Fdo->Flags |= DO_POWER_PAGABLE;
|
||||
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
|
||||
Failure:
|
||||
if (FdoExtension)
|
||||
{
|
||||
if (FdoExtension->Ldo)
|
||||
IoDetachDevice(FdoExtension->Ldo);
|
||||
}
|
||||
|
||||
if (Fdo)
|
||||
{
|
||||
IoDeleteDevice(Fdo);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
InPortUnload(
|
||||
_In_ PDRIVER_OBJECT DriverObject)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s(%p)\n", __FUNCTION__, DriverObject);
|
||||
|
||||
RtlFreeUnicodeString(&DriverRegistryPath);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortPower(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
|
||||
DPRINT("%s(%p, %p) %X\n", __FUNCTION__, DeviceObject, Irp,
|
||||
IoGetCurrentIrpStackLocation(Irp)->MinorFunction);
|
||||
|
||||
Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, Irp);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
Irp->IoStatus.Status = Status;
|
||||
PoStartNextPowerIrp(Irp);
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
PoStartNextPowerIrp(Irp);
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
Status = PoCallDriver(DeviceExtension->Ldo, Irp);
|
||||
|
||||
IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PUNICODE_STRING RegistryPath)
|
||||
{
|
||||
DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath);
|
||||
|
||||
DriverRegistryPath.Buffer = ExAllocatePoolWithTag(NonPagedPool,
|
||||
RegistryPath->Length +
|
||||
sizeof(UNICODE_NULL),
|
||||
INPORT_TAG);
|
||||
if (!DriverRegistryPath.Buffer)
|
||||
{
|
||||
DPRINT1("Failed to allocate the registry string buffer\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
DriverRegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
|
||||
RtlCopyUnicodeString(&DriverRegistryPath, RegistryPath);
|
||||
DriverRegistryPath.Buffer[RegistryPath->Length / sizeof(WCHAR)] = UNICODE_NULL;
|
||||
|
||||
DriverObject->MajorFunction[IRP_MJ_CREATE] =
|
||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = InPortCreateClose;
|
||||
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = InPortInternalDeviceControl;
|
||||
DriverObject->MajorFunction[IRP_MJ_POWER] = InPortPower;
|
||||
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = InPortWmi;
|
||||
DriverObject->MajorFunction[IRP_MJ_PNP] = InPortPnp;
|
||||
DriverObject->DriverExtension->AddDevice = InPortAddDevice;
|
||||
DriverObject->DriverUnload = InPortUnload;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
158
drivers/input/inport/inport.h
Normal file
158
drivers/input/inport/inport.h
Normal file
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
* PROJECT: ReactOS InPort (Bus) Mouse Driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Main header file
|
||||
* COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
|
||||
*/
|
||||
|
||||
#ifndef _INPORT_H_
|
||||
#define _INPORT_H_
|
||||
|
||||
#include <wdm.h>
|
||||
#include <wmilib.h>
|
||||
#include <wmistr.h>
|
||||
#include <kbdmou.h>
|
||||
|
||||
#define INPORT_TAG 'tPnI'
|
||||
|
||||
typedef enum
|
||||
{
|
||||
dsStopped,
|
||||
dsStarted,
|
||||
dsRemoved
|
||||
} INPORT_DEVICE_STATE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NecBusMouse,
|
||||
MsInPortMouse,
|
||||
LogitechBusMouse
|
||||
} INPORT_MOUSE_TYPE;
|
||||
|
||||
typedef struct _INPORT_RAW_DATA
|
||||
{
|
||||
CHAR DeltaX;
|
||||
CHAR DeltaY;
|
||||
UCHAR Buttons;
|
||||
ULONG ButtonDiff;
|
||||
} INPORT_RAW_DATA, *PINPORT_RAW_DATA;
|
||||
|
||||
typedef struct _INPORT_DEVICE_EXTENSION
|
||||
{
|
||||
PDEVICE_OBJECT Self;
|
||||
PDEVICE_OBJECT Pdo;
|
||||
PDEVICE_OBJECT Ldo;
|
||||
INPORT_DEVICE_STATE State;
|
||||
IO_REMOVE_LOCK RemoveLock;
|
||||
WMILIB_CONTEXT WmiLibInfo;
|
||||
PUCHAR IoBase;
|
||||
INPORT_MOUSE_TYPE MouseType;
|
||||
|
||||
/* Interrupt */
|
||||
PKINTERRUPT InterruptObject;
|
||||
ULONG InterruptVector;
|
||||
KIRQL InterruptLevel;
|
||||
KINTERRUPT_MODE InterruptMode;
|
||||
BOOLEAN InterruptShared;
|
||||
KAFFINITY InterruptAffinity;
|
||||
|
||||
/* Movement data and state of the mouse buttons */
|
||||
INPORT_RAW_DATA RawData;
|
||||
|
||||
/* Mouclass */
|
||||
CONNECT_DATA ConnectData;
|
||||
PDEVICE_OBJECT ClassDeviceObject;
|
||||
PVOID ClassService;
|
||||
|
||||
/* Mouse packet */
|
||||
MOUSE_INPUT_DATA MouseInputData;
|
||||
|
||||
/* Previous state */
|
||||
ULONG MouseButtonState;
|
||||
|
||||
/* Mouse device attributes */
|
||||
MOUSE_ATTRIBUTES MouseAttributes;
|
||||
} INPORT_DEVICE_EXTENSION, *PINPORT_DEVICE_EXTENSION;
|
||||
|
||||
DRIVER_INITIALIZE DriverEntry;
|
||||
|
||||
DRIVER_UNLOAD InPortUnload;
|
||||
|
||||
DRIVER_ADD_DEVICE InPortAddDevice;
|
||||
|
||||
_Dispatch_type_(IRP_MJ_CREATE)
|
||||
_Dispatch_type_(IRP_MJ_CLOSE)
|
||||
DRIVER_DISPATCH_PAGED InPortCreateClose;
|
||||
|
||||
_Dispatch_type_(IRP_MJ_INTERNAL_DEVICE_CONTROL)
|
||||
DRIVER_DISPATCH_RAISED InPortInternalDeviceControl;
|
||||
|
||||
_Dispatch_type_(IRP_MJ_POWER)
|
||||
DRIVER_DISPATCH_RAISED InPortPower;
|
||||
|
||||
_Dispatch_type_(IRP_MJ_SYSTEM_CONTROL)
|
||||
DRIVER_DISPATCH_PAGED InPortWmi;
|
||||
|
||||
_Dispatch_type_(IRP_MJ_PNP)
|
||||
DRIVER_DISPATCH_PAGED InPortPnp;
|
||||
|
||||
KSERVICE_ROUTINE InPortIsr;
|
||||
|
||||
IO_DPC_ROUTINE InPortDpcForIsr;
|
||||
|
||||
KSYNCHRONIZE_ROUTINE InPortStartMouse;
|
||||
|
||||
KSYNCHRONIZE_ROUTINE InPortStopMouse;
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortStartDevice(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortRemoveDevice(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
InPortInitializeMouse(
|
||||
_In_ PINPORT_DEVICE_EXTENSION DeviceExtension);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortWmiRegistration(
|
||||
_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortWmiDeRegistration(
|
||||
_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortQueryWmiRegInfo(
|
||||
_Inout_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PULONG RegFlags,
|
||||
_Inout_ PUNICODE_STRING InstanceName,
|
||||
_Out_opt_ PUNICODE_STRING *RegistryPath,
|
||||
_Inout_ PUNICODE_STRING MofResourceName,
|
||||
_Out_opt_ PDEVICE_OBJECT *Pdo);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortQueryWmiDataBlock(
|
||||
_Inout_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ ULONG GuidIndex,
|
||||
_In_ ULONG InstanceIndex,
|
||||
_In_ ULONG InstanceCount,
|
||||
_Out_opt_ PULONG InstanceLengthArray,
|
||||
_In_ ULONG BufferAvail,
|
||||
_Out_opt_ PUCHAR Buffer);
|
||||
|
||||
extern UNICODE_STRING DriverRegistryPath;
|
||||
|
||||
#endif /* _INPORT_H_ */
|
5
drivers/input/inport/inport.rc
Normal file
5
drivers/input/inport/inport.rc
Normal file
|
@ -0,0 +1,5 @@
|
|||
#define REACTOS_VERSION_DLL
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "InPort (Bus) Mouse Device Driver"
|
||||
#define REACTOS_STR_INTERNAL_NAME "inport"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "inport.sys"
|
||||
#include <reactos/version.rc>
|
83
drivers/input/inport/ioctl.c
Normal file
83
drivers/input/inport/ioctl.c
Normal file
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* PROJECT: ReactOS InPort (Bus) Mouse Driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: I/O control handling
|
||||
* COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "inport.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortInternalDeviceControl(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PCONNECT_DATA ConnectData;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
DPRINT("%s(%p, %p) 0x%X\n", __FUNCTION__, DeviceObject, Irp,
|
||||
IrpSp->Parameters.DeviceIoControl.IoControlCode);
|
||||
|
||||
switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
|
||||
{
|
||||
case IOCTL_INTERNAL_MOUSE_CONNECT:
|
||||
if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(CONNECT_DATA))
|
||||
{
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Already connected */
|
||||
if (DeviceExtension->ClassService)
|
||||
{
|
||||
Status = STATUS_SHARING_VIOLATION;
|
||||
break;
|
||||
}
|
||||
|
||||
ConnectData = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
|
||||
DeviceExtension->ClassDeviceObject = ConnectData->ClassDeviceObject;
|
||||
DeviceExtension->ClassService = ConnectData->ClassService;
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
|
||||
case IOCTL_INTERNAL_MOUSE_DISCONNECT:
|
||||
DeviceExtension->ClassService = NULL;
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
|
||||
case IOCTL_MOUSE_QUERY_ATTRIBUTES:
|
||||
if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(MOUSE_ATTRIBUTES))
|
||||
{
|
||||
Status = STATUS_BUFFER_TOO_SMALL;
|
||||
break;
|
||||
}
|
||||
|
||||
*(PMOUSE_ATTRIBUTES)Irp->AssociatedIrp.SystemBuffer = DeviceExtension->MouseAttributes;
|
||||
Irp->IoStatus.Information = sizeof(MOUSE_ATTRIBUTES);
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
break;
|
||||
}
|
||||
|
||||
Irp->IoStatus.Status = Status;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return Status;
|
||||
}
|
283
drivers/input/inport/pnp.c
Normal file
283
drivers/input/inport/pnp.c
Normal file
|
@ -0,0 +1,283 @@
|
|||
/*
|
||||
* PROJECT: ReactOS InPort (Bus) Mouse Driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Plug and Play requests handling
|
||||
* COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "inport.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
|
||||
#ifdef ALLOC_PRAGMA
|
||||
#pragma alloc_text(PAGE, InPortPnp)
|
||||
#pragma alloc_text(PAGE, InPortStartDevice)
|
||||
#pragma alloc_text(PAGE, InPortRemoveDevice)
|
||||
#endif
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortStartDevice(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PCM_RESOURCE_LIST AllocatedResources, AllocatedResourcesTranslated;
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, DescriptorTranslated;
|
||||
ULONG i;
|
||||
ULONG RawVector;
|
||||
BOOLEAN FoundBasePort = FALSE, FoundIrq = FALSE;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
ASSERT(DeviceExtension->State == dsStopped);
|
||||
|
||||
if (!IoForwardIrpSynchronously(DeviceExtension->Ldo, Irp))
|
||||
{
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
goto Complete;
|
||||
}
|
||||
Status = Irp->IoStatus.Status;
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("LDO failed to start 0x%X\n", Status);
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
AllocatedResources = IrpSp->Parameters.StartDevice.AllocatedResources;
|
||||
AllocatedResourcesTranslated = IrpSp->Parameters.StartDevice.AllocatedResourcesTranslated;
|
||||
if (!AllocatedResources || !AllocatedResourcesTranslated)
|
||||
{
|
||||
DPRINT1("No allocated resources\n");
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
if (AllocatedResources->Count != 1)
|
||||
DPRINT1("Expected FullList count is 1, got %d\n", AllocatedResources->Count);
|
||||
|
||||
for (i = 0; i < AllocatedResources->List[0].PartialResourceList.Count; i++)
|
||||
{
|
||||
Descriptor = &AllocatedResources->List[0].PartialResourceList.PartialDescriptors[i];
|
||||
DescriptorTranslated = &AllocatedResourcesTranslated->List[0].PartialResourceList.PartialDescriptors[i];
|
||||
|
||||
switch (Descriptor->Type)
|
||||
{
|
||||
case CmResourceTypePort:
|
||||
{
|
||||
DPRINT("[%p:%X:%X] I/O ports at [%p-%p]\n",
|
||||
Descriptor,
|
||||
Descriptor->ShareDisposition,
|
||||
Descriptor->Flags,
|
||||
Descriptor->u.Port.Start.LowPart,
|
||||
Descriptor->u.Port.Start.LowPart + (Descriptor->u.Port.Length - 1));
|
||||
|
||||
if (!FoundBasePort)
|
||||
{
|
||||
DeviceExtension->IoBase = ULongToPtr(Descriptor->u.Port.Start.u.LowPart);
|
||||
|
||||
FoundBasePort = TRUE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CmResourceTypeInterrupt:
|
||||
{
|
||||
DPRINT("[%p:%X:%X] INT Vec %d Lev %d Aff %IX\n",
|
||||
Descriptor,
|
||||
Descriptor->ShareDisposition,
|
||||
Descriptor->Flags,
|
||||
Descriptor->u.Interrupt.Vector,
|
||||
Descriptor->u.Interrupt.Level,
|
||||
Descriptor->u.Interrupt.Affinity);
|
||||
|
||||
if (!FoundIrq)
|
||||
{
|
||||
DeviceExtension->InterruptVector = DescriptorTranslated->u.Interrupt.Vector;
|
||||
DeviceExtension->InterruptLevel = (KIRQL)DescriptorTranslated->u.Interrupt.Level;
|
||||
if (DescriptorTranslated->Flags & CM_RESOURCE_INTERRUPT_LATCHED)
|
||||
DeviceExtension->InterruptMode = Latched;
|
||||
else
|
||||
DeviceExtension->InterruptMode = LevelSensitive;
|
||||
DeviceExtension->InterruptShared = (DescriptorTranslated->ShareDisposition == CmResourceShareShared);
|
||||
DeviceExtension->InterruptAffinity = DescriptorTranslated->u.Interrupt.Affinity;
|
||||
RawVector = Descriptor->u.Interrupt.Vector;
|
||||
|
||||
FoundIrq = TRUE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
DPRINT("[%p:%X:%X] Unrecognized resource type %X\n",
|
||||
Descriptor,
|
||||
Descriptor->ShareDisposition,
|
||||
Descriptor->Flags,
|
||||
Descriptor->Type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!FoundBasePort || !FoundIrq)
|
||||
{
|
||||
DPRINT1("The device resources were not found\n");
|
||||
Status = STATUS_DEVICE_CONFIGURATION_ERROR;
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
DPRINT("I/O base at %p\n", DeviceExtension->IoBase);
|
||||
DPRINT("IRQ %d\n", RawVector);
|
||||
|
||||
Status = InPortWmiRegistration(DeviceExtension);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("WMI registration failed 0x%X\n", Status);
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
InPortInitializeMouse(DeviceExtension);
|
||||
|
||||
Status = IoConnectInterrupt(&DeviceExtension->InterruptObject,
|
||||
InPortIsr,
|
||||
DeviceExtension,
|
||||
NULL,
|
||||
DeviceExtension->InterruptVector,
|
||||
DeviceExtension->InterruptLevel,
|
||||
DeviceExtension->InterruptLevel,
|
||||
DeviceExtension->InterruptMode,
|
||||
DeviceExtension->InterruptShared,
|
||||
DeviceExtension->InterruptAffinity,
|
||||
FALSE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Could not connect to interrupt %d\n", DeviceExtension->InterruptVector);
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
KeSynchronizeExecution(DeviceExtension->InterruptObject,
|
||||
InPortStartMouse,
|
||||
DeviceExtension);
|
||||
|
||||
DeviceExtension->State = dsStarted;
|
||||
|
||||
Complete:
|
||||
Irp->IoStatus.Status = Status;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortRemoveDevice(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
BOOLEAN IsStarted;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
InPortWmiDeRegistration(DeviceExtension);
|
||||
|
||||
IsStarted = (DeviceExtension->State == dsStarted);
|
||||
|
||||
DeviceExtension->State = dsRemoved;
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
Status = IoCallDriver(DeviceExtension->Ldo, Irp);
|
||||
|
||||
IoReleaseRemoveLockAndWait(&DeviceExtension->RemoveLock, Irp);
|
||||
|
||||
/* Device is active */
|
||||
if (IsStarted)
|
||||
{
|
||||
KeSynchronizeExecution(DeviceExtension->InterruptObject,
|
||||
InPortStopMouse,
|
||||
DeviceExtension);
|
||||
|
||||
IoDisconnectInterrupt(DeviceExtension->InterruptObject);
|
||||
|
||||
/* Flush DPC for ISR */
|
||||
KeFlushQueuedDpcs();
|
||||
}
|
||||
|
||||
IoDetachDevice(DeviceExtension->Ldo);
|
||||
IoDeleteDevice(DeviceObject);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortPnp(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s(%p, %p) %X\n",
|
||||
__FUNCTION__, DeviceObject, Irp, IrpSp->MinorFunction);
|
||||
|
||||
Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, Irp);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Status = Status;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
switch (IrpSp->MinorFunction)
|
||||
{
|
||||
case IRP_MN_START_DEVICE:
|
||||
Status = InPortStartDevice(DeviceObject, Irp);
|
||||
break;
|
||||
|
||||
case IRP_MN_REMOVE_DEVICE:
|
||||
return InPortRemoveDevice(DeviceObject, Irp);
|
||||
|
||||
case IRP_MN_QUERY_STOP_DEVICE:
|
||||
/* Device cannot work with other resources */
|
||||
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
break;
|
||||
|
||||
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
||||
case IRP_MN_STOP_DEVICE:
|
||||
case IRP_MN_CANCEL_STOP_DEVICE:
|
||||
case IRP_MN_SURPRISE_REMOVAL:
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
Status = IoCallDriver(DeviceExtension->Ldo, Irp);
|
||||
break;
|
||||
|
||||
default:
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
Status = IoCallDriver(DeviceExtension->Ldo, Irp);
|
||||
break;
|
||||
}
|
||||
|
||||
IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
|
||||
|
||||
return Status;
|
||||
}
|
202
drivers/input/inport/wmi.c
Normal file
202
drivers/input/inport/wmi.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* PROJECT: ReactOS InPort (Bus) Mouse Driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: WMI support
|
||||
* COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include "inport.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
|
||||
#ifdef ALLOC_PRAGMA
|
||||
#pragma alloc_text(PAGE, InPortWmi)
|
||||
#pragma alloc_text(PAGE, InPortWmiRegistration)
|
||||
#pragma alloc_text(PAGE, InPortWmiDeRegistration)
|
||||
#pragma alloc_text(PAGE, InPortQueryWmiRegInfo)
|
||||
#pragma alloc_text(PAGE, InPortQueryWmiDataBlock)
|
||||
#endif
|
||||
|
||||
GUID GuidWmiPortData = POINTER_PORT_WMI_STD_DATA_GUID;
|
||||
|
||||
WMIGUIDREGINFO InPortWmiGuidList[] =
|
||||
{
|
||||
{&GuidWmiPortData, 1, 0}
|
||||
};
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortQueryWmiRegInfo(
|
||||
_Inout_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PULONG RegFlags,
|
||||
_Inout_ PUNICODE_STRING InstanceName,
|
||||
_Out_opt_ PUNICODE_STRING *RegistryPath,
|
||||
_Inout_ PUNICODE_STRING MofResourceName,
|
||||
_Out_opt_ PDEVICE_OBJECT *Pdo)
|
||||
{
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
|
||||
UNREFERENCED_PARAMETER(InstanceName);
|
||||
UNREFERENCED_PARAMETER(MofResourceName);
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s()\n", __FUNCTION__);
|
||||
|
||||
*RegFlags = WMIREG_FLAG_INSTANCE_PDO;
|
||||
*RegistryPath = &DriverRegistryPath;
|
||||
*Pdo = DeviceExtension->Pdo;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortQueryWmiDataBlock(
|
||||
_Inout_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ ULONG GuidIndex,
|
||||
_In_ ULONG InstanceIndex,
|
||||
_In_ ULONG InstanceCount,
|
||||
_Out_opt_ PULONG InstanceLengthArray,
|
||||
_In_ ULONG BufferAvail,
|
||||
_Out_opt_ PUCHAR Buffer)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PPOINTER_PORT_WMI_STD_DATA InPortData;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s()\n", __FUNCTION__);
|
||||
|
||||
if (GuidIndex > RTL_NUMBER_OF(InPortWmiGuidList))
|
||||
{
|
||||
Status = STATUS_WMI_GUID_NOT_FOUND;
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
/* Only register 1 instance per GUID */
|
||||
if (InstanceIndex != 0 || InstanceCount != 1)
|
||||
{
|
||||
Status = STATUS_WMI_INSTANCE_NOT_FOUND;
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
if (!InstanceLengthArray || BufferAvail < sizeof(POINTER_PORT_WMI_STD_DATA))
|
||||
{
|
||||
Status = STATUS_BUFFER_TOO_SMALL;
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
InPortData = (PPOINTER_PORT_WMI_STD_DATA)Buffer;
|
||||
|
||||
/* Bus mouse connector isn't defined in the DDK, so set type to something generic */
|
||||
InPortData->ConnectorType = POINTER_PORT_WMI_STD_I8042;
|
||||
/* 1 packet */
|
||||
InPortData->DataQueueSize = 1;
|
||||
/* Not supported by device */
|
||||
InPortData->ErrorCount = 0;
|
||||
|
||||
InPortData->Buttons = DeviceExtension->MouseAttributes.NumberOfButtons;
|
||||
InPortData->HardwareType = POINTER_PORT_WMI_STD_MOUSE;
|
||||
*InstanceLengthArray = sizeof(POINTER_PORT_WMI_STD_DATA);
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
|
||||
Complete:
|
||||
return WmiCompleteRequest(DeviceObject,
|
||||
Irp,
|
||||
Status,
|
||||
sizeof(POINTER_PORT_WMI_STD_DATA),
|
||||
IO_NO_INCREMENT);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortWmiRegistration(
|
||||
_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
DeviceExtension->WmiLibInfo.GuidCount = RTL_NUMBER_OF(InPortWmiGuidList);
|
||||
DeviceExtension->WmiLibInfo.GuidList = InPortWmiGuidList;
|
||||
|
||||
DeviceExtension->WmiLibInfo.QueryWmiRegInfo = InPortQueryWmiRegInfo;
|
||||
DeviceExtension->WmiLibInfo.QueryWmiDataBlock = InPortQueryWmiDataBlock;
|
||||
DeviceExtension->WmiLibInfo.SetWmiDataBlock = NULL;
|
||||
DeviceExtension->WmiLibInfo.SetWmiDataItem = NULL;
|
||||
DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL;
|
||||
DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL;
|
||||
|
||||
return IoWMIRegistrationControl(DeviceExtension->Self,
|
||||
WMIREG_ACTION_REGISTER);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortWmiDeRegistration(
|
||||
_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
return IoWMIRegistrationControl(DeviceExtension->Self,
|
||||
WMIREG_ACTION_DEREGISTER);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
InPortWmi(
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
SYSCTL_IRP_DISPOSITION Disposition;
|
||||
PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
DPRINT("%s(%p, %p) %X\n", __FUNCTION__, DeviceObject, Irp,
|
||||
IoGetCurrentIrpStackLocation(Irp)->MinorFunction);
|
||||
|
||||
Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, Irp);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Status = Status;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = WmiSystemControl(&DeviceExtension->WmiLibInfo,
|
||||
DeviceObject,
|
||||
Irp,
|
||||
&Disposition);
|
||||
switch (Disposition)
|
||||
{
|
||||
case IrpProcessed:
|
||||
break;
|
||||
|
||||
case IrpNotCompleted:
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
break;
|
||||
|
||||
case IrpForward:
|
||||
case IrpNotWmi:
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
Status = IoCallDriver(DeviceExtension->Ldo, Irp);
|
||||
break;
|
||||
}
|
||||
|
||||
IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
|
||||
|
||||
return Status;
|
||||
}
|
|
@ -29,11 +29,14 @@ HKR, , UpperFilters, 0x00010000, "mouclass"
|
|||
%IbmMfg% = IbmMfg
|
||||
%LogMfg% = LogMfg
|
||||
%MSMfg% = MSMfg
|
||||
%NecMfg% = NecMfg
|
||||
|
||||
[StdMfg]
|
||||
%SERIAL_MOUSE.DeviceDesc% = Serial_Inst,*PNP0F0C,SERENUM\PNP0F0C,*PNP0F17,SERENUM\PNP0F17,SERIAL_MOUSE
|
||||
%PS2_MOUSE.DeviceDesc% = PS2_Inst,*PNP0F0E,*PNP0F19,PS2_MOUSE
|
||||
%HID_MOUSE.DeviceDesc% = HID_Inst,HID_DEVICE_SYSTEM_MOUSE
|
||||
%*PNP0F0D.DeviceDesc% = Inp_Inst,*PNP0F0D
|
||||
%*PNP0F11.DeviceDesc% = Inp_Inst,*PNP0F11
|
||||
%*PNP0F13.DeviceDesc% = PS2_Inst,*PNP0F13
|
||||
|
||||
[IbmMfg]
|
||||
|
@ -42,12 +45,18 @@ HKR, , UpperFilters, 0x00010000, "mouclass"
|
|||
[LogMfg]
|
||||
%*PNP0F08.DeviceDesc% = Serial_Inst,*PNP0F08,SERENUM\PNP0F08
|
||||
%*PNP0F12.DeviceDesc% = PS2_Inst,*PNP0F12
|
||||
%*PNP0F15.DeviceDesc% = Inp_Inst,*PNP0F15
|
||||
|
||||
[MSMfg]
|
||||
%*PNP0F00.DeviceDesc% = Inp_Inst,*PNP0F00
|
||||
%*PNP0F01.DeviceDesc% = Serial_Inst,*PNP0F01,SERENUM\PNP0F01
|
||||
%*PNP0F02.DeviceDesc% = Inp_Inst,*PNP0F02
|
||||
%*PNP0F03.DeviceDesc% = PS2_Inst,*PNP0F03
|
||||
%HID\Vid_045E&Pid_0047.DeviceDesc%=HID_Inst,, HID\Vid_045E&Pid_0047
|
||||
|
||||
[NecMfg]
|
||||
%*nEC1F00.DeviceDesc% = Inp_Inst,*nEC1F00
|
||||
|
||||
; Generic Mouse
|
||||
%HID.MouseDevice%=HID_Inst,,HID_DEVICE_SYSTEM_MOUSE
|
||||
|
||||
|
@ -109,6 +118,25 @@ HKLM,"SYSTEM\CurrentControlSet\Services\i8042prt\Parameters","MouseResolution",0
|
|||
HKR, , EnumPropPages32, 0, "syssetup.dll,PS2MousePropPageProvider"
|
||||
HKR, , LocationInformationOverride, 0, %LocationOverride%
|
||||
|
||||
;----------------------------- INPORT DRIVER ----------------------------
|
||||
|
||||
[Inp_Inst]
|
||||
CopyFiles = Inp_CopyFiles.NT, Mouclass_CopyFiles.NT
|
||||
|
||||
[Inp_CopyFiles.NT]
|
||||
inport.sys
|
||||
|
||||
[Inp_Inst.Services]
|
||||
AddService = inport, 0x00000002, Inp_Service_Inst
|
||||
AddService = mouclass, , mouclass_Service_Inst
|
||||
|
||||
[Inp_Service_Inst]
|
||||
ServiceType = 1
|
||||
StartType = 1
|
||||
ErrorControl = 1
|
||||
ServiceBinary = %12%\inport.sys
|
||||
LoadOrderGroup = Pointer Port
|
||||
|
||||
;---------------------------- HID MOUSE DRIVER --------------------------
|
||||
|
||||
[HID_Inst.NT]
|
||||
|
@ -140,6 +168,8 @@ StdMfg = "(Standard mice)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Standard Serial Mouse"
|
||||
PS2_MOUSE.DeviceDesc = "Standard PS/2 Mouse"
|
||||
HID_MOUSE.DeviceDesc = "HID Mouse"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 port for PS/2-style mice"
|
||||
|
||||
IbmMfg = "IBM"
|
||||
|
@ -148,11 +178,17 @@ IbmMfg = "IBM"
|
|||
LogMfg = "Logitech"
|
||||
*PNP0F08.DeviceDesc = "Logitech Serial Mouse"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2-style Mouse"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
MSMfg = "Microsoft"
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft Serial Mouse"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2-style Mouse"
|
||||
|
||||
NecMfg = "NEC"
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0405]
|
||||
MouseClassName = "Myši a jiná polohovací zařízení"
|
||||
|
||||
|
@ -160,16 +196,23 @@ StdMfg = "(Standardní myši)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Standardní sériová myš"
|
||||
PS2_MOUSE.DeviceDesc = "Standardní PS/2 myš"
|
||||
HID_MOUSE.DeviceDesc = "HID myš"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 port pro PS/2 myši"
|
||||
|
||||
*IBM3780.DeviceDesc = "IBM PS/2 Trackpoint"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech sériová myš"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2 myš"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft sériová myš"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2 myš"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0407]
|
||||
MouseClassName = "Mäuse und andere Zeigegeräte"
|
||||
LocationOverride = "eingesteckt in PS/2-Mausanschluss"
|
||||
|
@ -178,14 +221,21 @@ StdMfg = "(Standard-Maus)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Standard serielle Maus"
|
||||
PS2_MOUSE.DeviceDesc = "Standard PS/2 Maus"
|
||||
HID_MOUSE.DeviceDesc = "HID Maus"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 Anschluss für PS/2-Maus"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech serielle Maus"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2-Maus"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft serielle Maus"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2-Maus"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0408]
|
||||
MouseClassName = "Ποντίκια και άλλες συσκευές εισόδου"
|
||||
|
||||
|
@ -193,16 +243,23 @@ StdMfg = "(Πρότυπα ποντίκια)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Πρότυπο Σειριακό Ποντίκι"
|
||||
PS2_MOUSE.DeviceDesc = "Πρότυπο PS/2 Ποντίκι"
|
||||
HID_MOUSE.DeviceDesc = "Ποντίκι HID"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 θύρα για PS/2 ποντίκια"
|
||||
|
||||
*IBM3780.DeviceDesc = "IBM PS/2 Trackpoint"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech Σειριακό Ποντίκι"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2 Ποντίκι"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft Σειριακό Ποντίκι"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2 Ποντίκι"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0a]
|
||||
ReactOS = "Equipo de ReactOS"
|
||||
MouseClassName = "Ratones y otros dispositivos señaladores"
|
||||
|
@ -212,16 +269,23 @@ StdMfg = "(Ratón estándar)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Ratón serie estándar"
|
||||
PS2_MOUSE.DeviceDesc = "Ratón PS/2 estándar"
|
||||
HID_MOUSE.DeviceDesc = "Ratón oculto"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "Puerto PS/2 para ratón PS/2"
|
||||
|
||||
*IBM3780.DeviceDesc = "Trackpoint PS/2 de IBM"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Ratón serie de Logitech"
|
||||
*PNP0F12.DeviceDesc = "Ratón PS/2 de Logitech"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Ratón serie de Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Ratón PS/2 de Microsoft"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.040C]
|
||||
MouseClassName = "Souris et autres périphériques de pointage"
|
||||
LocationOverride = "Branché sur le port PS/2"
|
||||
|
@ -230,14 +294,21 @@ StdMfg = "(Souris standards)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Souris série standard"
|
||||
PS2_MOUSE.DeviceDesc = "Souris PS/2 standard"
|
||||
HID_MOUSE.DeviceDesc = "Souris HID"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "Port PS/2 pour souris type PS/2"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Souris série Logitech"
|
||||
*PNP0F12.DeviceDesc = "Souris PS/2 Logitech"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Souris série Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Souris PS/2 Microsoft"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0411]
|
||||
MouseClassName = "マウスとその他のポインティング デバイス"
|
||||
|
||||
|
@ -245,16 +316,23 @@ StdMfg = "(スタンダード マウス)"
|
|||
SERIAL_MOUSE.DeviceDesc = "スタンダード シリアル マウス"
|
||||
PS2_MOUSE.DeviceDesc = "スタンダード PS/2 マウス"
|
||||
HID_MOUSE.DeviceDesc = "HID マウス"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2接続マウス用のPS/2 ポート"
|
||||
|
||||
*IBM3780.DeviceDesc = "IBM PS/2 トラックポイント"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech シリアル マウス"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2接続マウス"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft シリアル マウス"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2接続マウス"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0415]
|
||||
ReactOS = "Zespół ReactOS"
|
||||
MouseClassName = "Mysz i inne urządzenia wskazujące"
|
||||
|
@ -264,16 +342,23 @@ StdMfg = "(Standardowa mysz)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Standardowa mysz szeregowa"
|
||||
PS2_MOUSE.DeviceDesc = "Standardowa mysz PS/2"
|
||||
HID_MOUSE.DeviceDesc = "Mysz zgodna z HID"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "Port PS/2 dla myszy"
|
||||
|
||||
*IBM3780.DeviceDesc = "Trackpoint PS/2 IBM"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Mysz szeregowa Logitech"
|
||||
*PNP0F12.DeviceDesc = "Mysz PS/2 Logitech"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Mysz szeregowa Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Mysz PS/2 Microsoft"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0416]
|
||||
MouseClassName = "Mouse e outros dispositivos apontadores"
|
||||
|
||||
|
@ -281,16 +366,23 @@ StdMfg = "(Mouse padrão)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Mouse serial padrão"
|
||||
PS2_MOUSE.DeviceDesc = "Mouse PS/2 padrão"
|
||||
HID_MOUSE.DeviceDesc = "Mouse interno"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "Porta PS/2 para mouse PS/2"
|
||||
|
||||
*IBM3780.DeviceDesc = "Trackpoint PS/2 IBM"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Mouse serial Logitech"
|
||||
*PNP0F12.DeviceDesc = "Mouse PS/2 Logitech"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Mouse serial Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Mouse PS/2 Microsoft"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0418]
|
||||
ReactOS = "Echipa ReactOS"
|
||||
MouseClassName = "Șoricel și alte dispozitive de indicare"
|
||||
|
@ -299,16 +391,23 @@ StdMfg = "(șoricel standard)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Șoricel serial standard"
|
||||
PS2_MOUSE.DeviceDesc = "Șoricel PS/2 standard"
|
||||
HID_MOUSE.DeviceDesc = "Șoricel HID"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "Port pentru șoricel PS/2"
|
||||
|
||||
*IBM3780.DeviceDesc = "Rotulă IBM PS/2"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Șoricel serial Logitech"
|
||||
*PNP0F12.DeviceDesc = "Șoricel PS/2 Logitech"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Șoricel serial Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Șoricel PS/2 Microsoft"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0419]
|
||||
ReactOS = "Команда ReactOS"
|
||||
MouseClassName = "Мыши и другие указывающие устройства"
|
||||
|
@ -318,14 +417,21 @@ StdMfg = "(Стандартная мышь)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Стандартная последовательная мышь"
|
||||
PS2_MOUSE.DeviceDesc = "Стандартная мышь PS/2"
|
||||
HID_MOUSE.DeviceDesc = "HID-мышь"
|
||||
*PNP0F0D.DeviceDesc = "Стандартная мышь InPort"
|
||||
*PNP0F11.DeviceDesc = "Стандартная шинная мышь"
|
||||
*PNP0F13.DeviceDesc = "PS/2-порт на мыши PS/2-вида"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Последовательная мышь Logitech"
|
||||
*PNP0F12.DeviceDesc = "Мышь Logitech PS/2-вида"
|
||||
*PNP0F15.DeviceDesc = "Шинная мышь Logitech"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Шинная мышь Microsoft"
|
||||
*PNP0F01.DeviceDesc = "Последовательная мышь Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Мышь Microsoft InPort"
|
||||
*PNP0F03.DeviceDesc = "Мышь Microsoft PS/2-вида"
|
||||
|
||||
*nEC1F00.DeviceDesc = "Шинная мышь для NEC PC-98"
|
||||
|
||||
[Strings.041B]
|
||||
MouseClassName = "Myši a iné polohovacie zariadenia"
|
||||
|
||||
|
@ -333,14 +439,21 @@ StdMfg = "(Štandardná myš)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Štandardná sériová myš"
|
||||
PS2_MOUSE.DeviceDesc = "Štandardná PS/2 myš"
|
||||
HID_MOUSE.DeviceDesc = "HID myš"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 port pre myši typu PS/2"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech sériová myš"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2 myš"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft sériová myš"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2 myš"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.041f]
|
||||
ReactOS = "ReactOS Takımı"
|
||||
MouseClassName = "Fâre ve Başka İmleme Aygıtları"
|
||||
|
@ -350,16 +463,23 @@ StdMfg = "(Ölçünlü Fâre)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Ölçünlü Dizilik Fâre"
|
||||
PS2_MOUSE.DeviceDesc = "Ölçünlü PS/2 Fâre"
|
||||
HID_MOUSE.DeviceDesc = "HID Fâre"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 Türünde Fâre İçin PS/2 Girişi"
|
||||
|
||||
*IBM3780.DeviceDesc = "IBM PS/2 Trackpoint"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech Dizilik Fâre"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2 Türünde Fâre"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft Dizilik Fâre"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2 Türünde Fâre"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0422]
|
||||
ReactOS = "Команда ReactOS"
|
||||
MouseClassName = "Миші та інші вказівні пристрої"
|
||||
|
@ -369,16 +489,23 @@ StdMfg = "(Стандартні миші)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Стандартна послідовна миша"
|
||||
PS2_MOUSE.DeviceDesc = "Стандартна миша PS/2"
|
||||
HID_MOUSE.DeviceDesc = "HID-миша"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "Порт PS/2 для миші PS/2-типу"
|
||||
|
||||
*IBM3780.DeviceDesc = "Трекпойнт IBM PS/2"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Послідовна миша Logitech"
|
||||
*PNP0F12.DeviceDesc = "Миша Logitech PS/2-типу"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Послідовна миша Microsoft"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Миша Microsoft PS/2-типу"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0427]
|
||||
MouseClassName = "Pelės ir kiti manipuliatoriai"
|
||||
|
||||
|
@ -386,25 +513,39 @@ StdMfg = "(Standartinė pelė)"
|
|||
SERIAL_MOUSE.DeviceDesc = "Standartinė nuoseklioji pelė"
|
||||
PS2_MOUSE.DeviceDesc = "Standartinė PS/2 pelė"
|
||||
HID_MOUSE.DeviceDesc = "HID pelė"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "PS/2 jungtis PS/2 tipo pelei"
|
||||
|
||||
*IBM3780.DeviceDesc = "IBM PS/2 rutulinis manipuliatorius"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech nuoseklioji pelė"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2 tipo pelė"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft nuoseklioji pelė"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2 tipo pelė"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
||||
[Strings.0804]
|
||||
StdMfg = "(标准鼠标)"
|
||||
SERIAL_MOUSE.DeviceDesc = "标准串口鼠标"
|
||||
PS2_MOUSE.DeviceDesc = "标准 PS/2 鼠标"
|
||||
HID_MOUSE.DeviceDesc = "HID 鼠标"
|
||||
*PNP0F0D.DeviceDesc = "Standard InPort Mouse"
|
||||
*PNP0F11.DeviceDesc = "Standard Bus Mouse"
|
||||
*PNP0F13.DeviceDesc = "用于 PS/2 风格鼠标的 PS/2 端口"
|
||||
|
||||
*PNP0F08.DeviceDesc = "Logitech 串口鼠标"
|
||||
*PNP0F12.DeviceDesc = "Logitech PS/2 风格鼠标"
|
||||
*PNP0F15.DeviceDesc = "Logitech Bus Mouse"
|
||||
|
||||
*PNP0F00.DeviceDesc = "Microsoft Bus Mouse"
|
||||
*PNP0F01.DeviceDesc = "Microsoft 串口鼠标"
|
||||
*PNP0F02.DeviceDesc = "Microsoft InPort Mouse"
|
||||
*PNP0F03.DeviceDesc = "Microsoft PS/2 风格鼠标"
|
||||
|
||||
*nEC1F00.DeviceDesc = "NEC PC-98 Bus Mouse"
|
||||
|
|
Loading…
Reference in a new issue