mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
Fix the completely retarded implementation of KdComPortInUse.
The original definition of this variable seems to have been based on the retarded type in the serial.sys source sample, which defines it as: extern PUCHAR *KdComPortInUse; This, somehow, works in MSVC, but gcc complains about the lack of import specifier (KdComPortInUse is exported by HAL). This was 'fixed' by adding the import specifier to ros. So instead of: PUCHAR *KdComPortInUse; We ended up with: NTHALAPI PUCHAR *KdComPortInUse; Which becomes 3 dereferences instead of 2, which is incorrect. This was 'fixed' by hacking the variable in HAL too. Use "extern PUCHAR NTHALAPI KdComPortInUse" to be compatible with both compilers, remove the HAL hacks, and fix the usage of the variable. Fixes the serial.sys crash when booted with _WINKD_ + kdcom from Windows 2003, as kdcom would (due to the HAL hack) set the internal 'pointer' to the port value, and serial would end up dereferencing the port address svn path=/trunk/; revision=38960
This commit is contained in:
parent
ec8a8e45f6
commit
dc7184e73f
12 changed files with 12 additions and 27 deletions
|
@ -231,7 +231,7 @@ KdPortInitialize(
|
|||
return FALSE;
|
||||
|
||||
/* set global info */
|
||||
*KdComPortInUse = (PUCHAR)DefaultPort.BaseAddress;
|
||||
KdComPortInUse = (PUCHAR)DefaultPort.BaseAddress;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -402,7 +402,7 @@ AcpiCheckIfIsSerialDebugPort(
|
|||
case io:
|
||||
{
|
||||
IO_RESOURCE *io_data = (IO_RESOURCE*) &resource->data;
|
||||
if (*KdComPortInUse == ULongToPtr(io_data->min_base_address))
|
||||
if (KdComPortInUse == (PUCHAR)io_data->min_base_address)
|
||||
{
|
||||
ExFreePool(Buffer.pointer);
|
||||
return TRUE;
|
||||
|
|
|
@ -223,7 +223,8 @@ SerialPnpStartDevice(
|
|||
ComPortBase = ULongToPtr(DeviceExtension->BaseAddress);
|
||||
|
||||
/* Test if we are trying to start the serial port used for debugging */
|
||||
if (*KdComPortInUse == ULongToPtr(DeviceExtension->BaseAddress))
|
||||
DPRINT1("Comparing addresses: KdComPortInUse: %p, ComPortBase: %p\n", KdComPortInUse, ComPortBase);
|
||||
if (KdComPortInUse == ComPortBase)
|
||||
{
|
||||
INFO_(SERIAL, "Failing IRP_MN_START_DEVICE as this serial port is used for debugging\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
ULONG _KdComPortInUse = 0;
|
||||
PUCHAR KdComPortInUse;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
@ stdcall IoSetPartitionInformation(ptr long long long) HalpSetPartitionInformation
|
||||
@ stdcall IoWritePartitionTable(ptr long long long ptr) HalpWritePartitionTable
|
||||
@ stdcall KeAcquireSpinLock(ptr ptr)
|
||||
@ extern KdComPortInUse _KdComPortInUse
|
||||
@ extern KdComPortInUse
|
||||
@ stdcall KeFlushWriteBuffer()
|
||||
@ stdcall KeGetCurrentIrql()
|
||||
@ stdcall KeLowerIrql(long)
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
/* DATA **********************************************************************/
|
||||
|
||||
ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount;
|
||||
ULONG _KdComPortInUse = 0;
|
||||
PUCHAR KdComPortInUse;
|
||||
|
||||
ULONG HalpIrqlTable[HIGH_LEVEL + 1] =
|
||||
{
|
||||
|
|
|
@ -14,9 +14,4 @@
|
|||
#include <peripherals/pl190.h>
|
||||
#include <peripherals/sp804.h>
|
||||
|
||||
//
|
||||
// WDK Hack
|
||||
//
|
||||
#define KdComPortInUse _KdComPortInUse
|
||||
|
||||
#endif /* __INTERNAL_HAL_HAL_H */
|
||||
|
|
|
@ -12,8 +12,7 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#define KdComPortInUse _KdComPortInUse
|
||||
ULONG KdComPortInUse = 0;
|
||||
PUCHAR KdComPortInUse;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
|
|
@ -8,9 +8,6 @@
|
|||
/* Temporary hack */
|
||||
#define KPCR_BASE 0xFF000000
|
||||
|
||||
/* WDK Hack */
|
||||
#define KdComPortInUse _KdComPortInUse
|
||||
|
||||
#define HAL_APC_REQUEST 0
|
||||
#define HAL_DPC_REQUEST 1
|
||||
|
||||
|
|
|
@ -12,12 +12,7 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#ifdef __GNUC__
|
||||
static PUCHAR realKdComPortInUse = 0;
|
||||
PUCHAR *_KdComPortInUse = &realKdComPortInUse;
|
||||
#else
|
||||
PUCHAR _KdComPortInUse = 0;
|
||||
#endif
|
||||
PUCHAR KdComPortInUse;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
|
|
@ -223,9 +223,7 @@ extern NTSYSAPI HAL_PRIVATE_DISPATCH HalPrivateDispatchTable;
|
|||
//
|
||||
// HAL Exports
|
||||
//
|
||||
#ifndef _NTHAL_
|
||||
extern NTHALAPI PUCHAR *KdComPortInUse;
|
||||
#endif
|
||||
extern PUCHAR NTHALAPI KdComPortInUse;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -97,7 +97,7 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
|
|||
|
||||
if (BootPhase == 0)
|
||||
{
|
||||
*KdComPortInUse = NULL;
|
||||
KdComPortInUse = NULL;
|
||||
|
||||
/* Write out the functions that we support for now */
|
||||
DispatchTable->KdpInitRoutine = KdpInitDebugLog;
|
||||
|
@ -182,7 +182,7 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
|
|||
KdpDebugMode.Serial = FALSE;
|
||||
return;
|
||||
}
|
||||
*KdComPortInUse = (PUCHAR)(ULONG_PTR)SerialPortInfo.BaseAddress;
|
||||
KdComPortInUse = (PUCHAR)(ULONG_PTR)SerialPortInfo.BaseAddress;
|
||||
|
||||
/* Register as a Provider */
|
||||
InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
|
||||
|
|
Loading…
Reference in a new issue