From ae018d780ece6e9a157df5d2a228380d2bdbe95f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 23 May 2007 21:26:24 +0000 Subject: [PATCH] - Merge Revision: 25668 Author: dgorbachev Date: 11:04:23, 1 February 2007. Message: Commit attachment #1151 ---- Modified : /trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c - Merge Revision: 25745 Author: dgorbachev Date: 3:29:50, 7 February 2007. Message: Fix "keyboard does not respond" bug. Thanks to Peter Krawies (breakoutbox /AT/ web /DOT/ de) ---- Modified : /trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c svn path=/branches/winldr/; revision=26875 --- arch/i386/hardware.c | 34 ++++++++++++++++++++++++---------- inifile/inifile.c | 12 ++++++------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/arch/i386/hardware.c b/arch/i386/hardware.c index 977ed8111b5..9b21665a8d7 100644 --- a/arch/i386/hardware.c +++ b/arch/i386/hardware.c @@ -1955,6 +1955,8 @@ DetectPS2AuxDevice(VOID) { UCHAR Scancode; UCHAR Status; + ULONG Loops; + BOOLEAN Result = TRUE; PS2ControllerWait(); WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_CONTROL, @@ -1965,31 +1967,43 @@ DetectPS2AuxDevice(VOID) WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, 0xF2); - StallExecutionProcessor(10000); + /* Wait for reply */ + for (Loops = 0; Loops < 10; Loops++) + { + StallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) + break; + } Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) - { - return FALSE; - } + Result = FALSE; Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0xFA) - return FALSE; + Result = FALSE; StallExecutionProcessor(10000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) - { - return FALSE; - } + Result = FALSE; Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0x00) - return FALSE; + Result = FALSE; - return TRUE; + /* Flush output buffer */ + for (Loops = 0; Loops < 10; Loops++) + { + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) + break; + StallExecutionProcessor(10000); + } + + return Result; } static VOID diff --git a/inifile/inifile.c b/inifile/inifile.c index fd59ee87b96..26638cc4383 100644 --- a/inifile/inifile.c +++ b/inifile/inifile.c @@ -104,12 +104,12 @@ BOOLEAN IniReadSettingByNumber(ULONG SectionId, ULONG SettingNumber, PCHAR Setti DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting value = %s\n", SectionItem->ItemValue)); DbgPrint((DPRINT_INIFILE, "1 NameSize = %d ValueSize = %d\n", NameSize, ValueSize)); - RtlZeroMemory(SettingName, NameSize); - RtlZeroMemory(SettingValue, ValueSize); DbgPrint((DPRINT_INIFILE, "2 NameSize = %d ValueSize = %d\n", NameSize, ValueSize)); - strncpy(SettingName, SectionItem->ItemName, NameSize); + strncpy(SettingName, SectionItem->ItemName, NameSize - 1); + SettingName[NameSize - 1] = '\0'; DbgPrint((DPRINT_INIFILE, "3 NameSize = %d ValueSize = %d\n", NameSize, ValueSize)); - strncpy(SettingValue, SectionItem->ItemValue, ValueSize); + strncpy(SettingValue, SectionItem->ItemValue, ValueSize - 1); + SettingValue[ValueSize - 1] = '\0'; DbgPrint((DPRINT_INIFILE, "4 NameSize = %d ValueSize = %d\n", NameSize, ValueSize)); DbgDumpBuffer(DPRINT_INIFILE, SettingName, NameSize); DbgDumpBuffer(DPRINT_INIFILE, SettingValue, ValueSize); @@ -146,8 +146,8 @@ BOOLEAN IniReadSettingByName(ULONG SectionId, PCSTR SettingName, PCHAR Buffer, U DbgPrint((DPRINT_INIFILE, "IniReadSettingByName() Setting \'%s\' found.\n", SettingName)); DbgPrint((DPRINT_INIFILE, "IniReadSettingByName() Setting value = %s\n", SectionItem->ItemValue)); - RtlZeroMemory(Buffer, BufferSize); - strncpy(Buffer, SectionItem->ItemValue, BufferSize); + strncpy(Buffer, SectionItem->ItemValue, BufferSize - 1); + Buffer[BufferSize - 1] = '\0'; return TRUE; }