[FREELDR] Properly set keyboard flags in hardware detection (#2288)
authorDmitry Borisov <di.sean@protonmail.com>
Wed, 29 Jan 2020 15:49:31 +0000 (21:49 +0600)
committerGitHub <noreply@github.com>
Wed, 29 Jan 2020 15:49:31 +0000 (16:49 +0100)
See https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_cm_keyboard_device_data

boot/freeldr/freeldr/arch/i386/machpc.c

index 9525397..3ca5578 100644 (file)
@@ -919,6 +919,7 @@ DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
     PCM_KEYBOARD_DEVICE_DATA KeyboardData;
     PCONFIGURATION_COMPONENT_DATA PeripheralKey;
     ULONG Size;
+    REGS Regs;
 
     /* HACK: don't call DetectKeyboardDevice() as it fails in Qemu 0.8.2
     if (DetectKeyboardDevice()) */
@@ -944,12 +945,21 @@ DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
         PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
         PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_KEYBOARD_DEVICE_DATA);
 
+        /* Int 16h AH=02h
+         * KEYBOARD - GET SHIFT FLAGS
+         *
+         * Return:
+         * AL - shift flags
+         */
+        Regs.b.ah = 0x02;
+        Int386(0x16, &Regs, &Regs);
+
         KeyboardData = (PCM_KEYBOARD_DEVICE_DATA)(PartialDescriptor + 1);
         KeyboardData->Version = 1;
         KeyboardData->Revision = 1;
         KeyboardData->Type = 4;
         KeyboardData->Subtype = 0;
-        KeyboardData->KeyboardFlags = 0x20;
+        KeyboardData->KeyboardFlags = Regs.b.al;
 
         /* Create controller key */
         FldrCreateComponentKey(ControllerKey,